/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.filecenter.application.das;

import cn.hallele.infrastructure.util.ObjectUtil;
import cn.hallele.ms.filecenter.application.bo.FileBO;
import cn.hallele.ms.filecenter.domain.action.file.FileDomainService;
import cn.hallele.ms.filecenter.domain.domain.FileDomain;
import cn.hallele.ms.infrastructure.core.convertor.das.ModelDas;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * hallele_ms_filecenter
 *
 * @author anle5
 * @since 2024/9/24 0:38
 */
@Slf4j
@Component
public class FileBDDas extends ModelDas<FileDomainService, FileBO, FileDomain> {
    public FileBDDas(FileDomainService option) {
        super(option);
    }

    /**
     * 文件上传接口
     *
     * @param fileBO 文件应用对象
     * @return 文件应用对象
     */
    public FileBO uploadFile(FileBO fileBO) {
        return revert(this.option.uploadFile(convert(fileBO)));
    }

    /**
     * 获取文件url地址
     *
     * @param id 文件id
     * @return 文件
     */
    public FileBO findById(Long id) {
        return revert(this.option.findById(id));
    }

    /**
     * 获取文件的url路径，供前端下载/展示，但是有过期时间
     *
     * @param id id
     * @return url
     */
    public FileBO getUrlWithExpires(Long id, int expires) {
        return revert(this.option.getUrlWithExpires(id, expires));
    }

    /**
     * 将T转成E
     *
     * @param fileBO 被转换者
     * @return S 转换后者
     */
    @Override
    protected FileDomain convert(FileBO fileBO) {
        return ObjectUtil.map(fileBO, f -> FileDomain.builder()
                .id(f.getId())
                .bucketName(f.getBucketName())
                .filename(f.getFilename())
                .filepath(f.getFilepath())
                .action(f.getAction())
                .url(f.getUrl())
                .tempUrl(f.getTempUrl())
                .initiator(f.getInitiator())
                .filetype(f.getFiletype())
                .md5(f.getMd5())
                .fileSize(f.getFileSize())
                .expires(f.getExpires())
                .updateTime(f.getUpdateTime())
                .createTime(f.getCreateTime())
                .multipartFile(f.getMultipartFile())
                .build());
    }

    /**
     * 将E回转陈T
     *
     * @param fileDomain 被回转换者
     * @return S 回转换后者
     */
    @Override
    protected FileBO revert(FileDomain fileDomain) {
        return ObjectUtil.map(fileDomain, f -> FileBO.builder()
                .id(f.getId())
                .bucketName(f.getBucketName())
                .filename(f.getFilename())
                .filepath(f.getFilepath())
                .action(f.getAction())
                .url(f.getUrl())
                .tempUrl(f.getTempUrl())
                .initiator(f.getInitiator())
                .filetype(f.getFiletype())
                .md5(f.getMd5())
                .fileSize(f.getFileSize())
                .expires(f.getExpires())
                .updateTime(f.getUpdateTime())
                .createTime(f.getCreateTime())
                .multipartFile(f.getMultipartFile())
                .build());
    }
}
